home *** CD-ROM | disk | FTP | other *** search
/ Gigantic Games 2 / Gigantic Games 2.iso / pc / _a_ / abitur / txt / stundenplan.mod < prev    next >
Text File  |  1994-12-23  |  7KB  |  269 lines

  1. IMPLEMENTATION MODULE StundenPlan;
  2.  
  3. FROM AbiturScreen IMPORT weisS, hgraU, blaU, dgraU, roT, BACKScreen;
  4. IMPORT RandomNoten; (* Damit wird RND.Seed gesetzt *)
  5. FROM FaecherNamen IMPORT FaecherTypen, FaecherNamen;
  6. FROM SYSTEM IMPORT ADR;
  7. FROM RandomNumber IMPORT RND;
  8. FROM Arts IMPORT BreakPoint, Assert;
  9. FROM Intuition IMPORT customScreen, NewWindow, WindowPtr,
  10.                       IDCMPFlagSet, IDCMPFlags, WindowFlagSet,
  11.                       WindowFlags, OpenWindow, CloseWindow,
  12.                       RefreshWindowFrame, SetWindowTitles,
  13.                       WindowToFront;
  14. FROM Graphics IMPORT Text, Move, Draw, SetAPen, RastPortPtr;
  15. FROM Str IMPORT Length;
  16.  
  17.  
  18. CONST Jahr1Titel = "1. Schulbabys";
  19.       Jahr2Titel = "2. Schulstreß";
  20.       Jahr3Titel = "3. Langeweile";
  21.       Jahr4Titel = "4. Bald Ende";
  22.  
  23.  
  24. PROCEDURE InitPlaene;
  25. VAR J:INTEGER;
  26.     rnd: INTEGER;
  27.     T,S: INTEGER; (* T: Tag,    S: Stunde *)
  28. BEGIN
  29.    FOR J := 1 TO 4 DO
  30.       Plaene[J].W := NIL;
  31.       FOR T := 0 TO 5 DO
  32.          FOR S := 8 TO 15 DO
  33.             WITH Plaene[J].Bele[T,S] DO
  34.                Frei := (S = 12) OR ((T=2)AND(S > 11)) OR ((T=5)AND(S>11));
  35.                MaturFach := (J = 4) AND (RND(3) = 1);
  36.                rnd := RND(ORD(Informatik) + 1);
  37.                Typ := Turnen;
  38.                WHILE rnd > 0 DO
  39.                   INC(Typ);
  40.                   DEC(rnd)
  41.                END
  42.             END
  43.          END
  44.       END
  45.    END
  46. END InitPlaene;
  47.  
  48.  
  49.  
  50. PROCEDURE IncTime;
  51. VAR i : INTEGER;
  52. BEGIN
  53.    WITH Zeit DO
  54.       IF (Tag = 5) AND (Stunde = 11) THEN
  55.          Tag := 0;
  56.          Stunde := 8
  57.       ELSIF (Tag = 2) AND (Stunde = 11) THEN
  58.          Tag := 3;
  59.          Stunde := 8
  60.       ELSIF Stunde = 11 THEN
  61.          Stunde := 13
  62.       ELSIF Stunde = 15 THEN
  63.          INC(Tag);
  64.          Stunde := 8
  65.       ELSE
  66.          INC(Stunde)
  67.       END
  68.    END;
  69.    FOR i := 1 TO 4 DO
  70.       IF Plaene[i].W # NIL THEN
  71.          ZeigePlan(i)
  72.       END
  73.    END
  74. END IncTime;
  75.  
  76.  
  77.  
  78. PROCEDURE GetFach(Jahr: INTEGER): FaecherTypen;
  79. (* Gibt vom aktuellen Jahr das aktuelle Fach zurück.
  80.  * Achtung: vor dem ersten IncTime kommt immer Turnen zurück.
  81.  *)
  82. BEGIN
  83.    IF Zeit.Stunde = 7 THEN RETURN Turnen END;
  84.    RETURN Plaene[Jahr].Bele[Zeit.Tag,Zeit.Stunde].Typ
  85. END GetFach;
  86.  
  87.  
  88.  
  89. PROCEDURE ZeichnePlan(Jahr: INTEGER);
  90. VAR RP: RastPortPtr;
  91.     S, T, i, j: INTEGER;
  92. BEGIN
  93.    (* Das Window wurde eben geöffnet, diese Procedur kann nur
  94.     * von ZeigePlan aufgerufen werden
  95.     *)
  96.    RP := Plaene[Jahr].W^.rPort;
  97.    SetAPen(RP, hgraU);
  98.  
  99.   (* Zeichne Tage *)
  100.  
  101.    Move(RP,    1, 18);
  102.    Text(RP, ADR(" \"), 2);
  103.    Move(RP,   24, 18);
  104.    Text(RP, ADR("MO"), 2);
  105.    Move(RP,   47, 18);
  106.    Text(RP, ADR("DI"), 2);
  107.    Move(RP,   70, 18);
  108.    Text(RP, ADR("MI"), 2);
  109.    Move(RP,   93, 18);
  110.    Text(RP, ADR("DO"), 2);
  111.    Move(RP,  116, 18);
  112.    Text(RP, ADR("FR"), 2);
  113.    Move(RP,  139, 18);
  114.    Text(RP, ADR("SA"), 2);
  115.  
  116.   (* Zeiten *)
  117.  
  118.    FOR S := 8 TO 18 DO
  119.       Move(RP, 3, 30 + (S-8) * 11);
  120.       CASE S OF
  121.         8: Text(RP, ADR(" 8"), 2);
  122.       | 9: Text(RP, ADR(" 9"), 2);
  123.       |10: Text(RP, ADR("10"), 2);
  124.       |11: Text(RP, ADR("11"), 2);
  125.       |12: Text(RP, ADR("12"), 2);
  126.       |13: Text(RP, ADR("13"), 2);
  127.       |14: Text(RP, ADR("14"), 2);
  128.       |15: Text(RP, ADR("15"), 2);
  129.       ELSE
  130.       END
  131.    END;
  132.  
  133.   (* Faecher *)
  134.    FOR T := 0 TO 5 DO
  135.       FOR S := 8 TO 15 DO
  136.          WITH Plaene[Jahr].Bele[T,S] DO
  137.             IF NOT Frei THEN
  138.                Move(RP, 23 * T + 24,
  139.                         11 * S - 57);
  140.                IF MaturFach THEN
  141.                   SetAPen(RP, blaU)
  142.                ELSE
  143.                   SetAPen(RP, weisS)
  144.                END;
  145.                Text(RP, ADR(FaecherNamen[Typ].ShortCut),
  146.                      Length(FaecherNamen[Typ].ShortCut))
  147.             END
  148.          END
  149.       END
  150.    END;
  151.  
  152.   (* Linien *)
  153.    SetAPen(RP, dgraU);
  154.    FOR i := 0 TO 7 DO
  155.       Move(RP,                    0, 11 * i + 22);
  156.       Draw(RP,Plaene[Jahr].W^.width, 11 * i + 22)
  157.    END;
  158.    FOR j := 0 TO 5 DO
  159.       Move(RP, 23 * j + 20, 0);
  160.       Draw(RP, 23 * j + 20, Plaene[Jahr].W^.height)
  161.    END;
  162.    RefreshWindowFrame(Plaene[Jahr].W)
  163. END ZeichnePlan;
  164.  
  165.  
  166.  
  167. PROCEDURE MarkKasten(Jahr, Tag, Stunde, Farbe: INTEGER);
  168. VAR T, S: INTEGER;
  169.     VAR RP: RastPortPtr;
  170. BEGIN
  171.    RP := Plaene[Jahr].W^.rPort;
  172.    T := 23 * Tag + 20;
  173.    S := 11 * (Stunde - 8) + 22 ;
  174.    SetAPen(RP, Farbe);
  175.    Move(RP, T     , S);
  176.    Draw(RP, T + 23, S);
  177.    Draw(RP, T + 23, S + 11);
  178.    Draw(RP, T     , S + 11);
  179.    Draw(RP, T     , S);
  180. END MarkKasten;
  181.  
  182.  
  183. PROCEDURE MarkAktuelleStunde(J: INTEGER);
  184. VAR T, S: INTEGER;
  185. BEGIN
  186.    T := Zeit.Tag;    (* 0 ..  5 *)
  187.    S := Zeit.Stunde; (* 8 .. 15 *)
  188.  
  189.    IF (S = 8) AND (T > 0) AND (T # 3) THEN
  190.       MarkKasten(J, T - 1,  15,dgraU);
  191.       MarkKasten(J, T    ,   8, roT)
  192.    ELSIF (S = 8) AND (T = 3) THEN
  193.       MarkKasten(J,   2  ,  11, dgraU);
  194.       MarkKasten(J,   3  ,   8, roT)
  195.    ELSIF (S = 8) AND (T = 0) THEN
  196.       MarkKasten(J,   5  ,  11, dgraU);
  197.       MarkKasten(J,   0  ,   8, roT)
  198.    ELSIF S = 13 THEN
  199.       MarkKasten(J,     T,  11, dgraU);
  200.       MarkKasten(J,     T,  13, roT)
  201.    ELSIF S > 8 THEN
  202.       MarkKasten(J,     T, S-1, dgraU);
  203.       MarkKasten(J,     T, S  , roT)
  204.    END;
  205.    RefreshWindowFrame(Plaene[J].W)
  206. END MarkAktuelleStunde;
  207.  
  208.  
  209.  
  210.  
  211.  
  212.  
  213. VAR NewPlanWindow: NewWindow;
  214.  
  215.  
  216. PROCEDURE ZeigePlan(Jahr: INTEGER);
  217. BEGIN
  218.    IF Plaene[Jahr].W = NIL THEN
  219.       Plaene[Jahr].W := OpenWindow(NewPlanWindow);
  220.       Assert(Plaene[Jahr].W # NIL, ADR("Fenster Problem"));
  221.       CASE Jahr OF
  222.         1: SetWindowTitles(Plaene[Jahr].W, ADR(Jahr1Titel), -1)
  223.       | 2: SetWindowTitles(Plaene[Jahr].W, ADR(Jahr2Titel), -1)
  224.       | 3: SetWindowTitles(Plaene[Jahr].W, ADR(Jahr3Titel), -1)
  225.       | 4: SetWindowTitles(Plaene[Jahr].W, ADR(Jahr4Titel), -1)
  226.       ELSE
  227.       END;
  228.       ZeichnePlan(Jahr)
  229.    END;
  230.    WindowToFront(Plaene[Jahr].W);
  231.    MarkAktuelleStunde(Jahr)
  232. END ZeigePlan;
  233.  
  234.  
  235.  
  236. PROCEDURE ClosePlanFenster(Jahr: INTEGER);
  237. BEGIN
  238.    IF Plaene[Jahr].W # NIL THEN
  239.       CloseWindow(Plaene[Jahr].W);
  240.       Plaene[Jahr].W := NIL
  241.    END
  242. END ClosePlanFenster;
  243.  
  244.  
  245.  
  246. BEGIN (* Initialisierung *)
  247.    Zeit.Tag := 0;
  248.    Zeit.Stunde := 8;
  249.    WITH NewPlanWindow DO
  250.       leftEdge := 0;
  251.       topEdge := 100;
  252.       width := 160;
  253.       height := 111;
  254.       detailPen := 0;
  255.       blockPen := 1;
  256.       idcmpFlags := IDCMPFlagSet{closeWindow};
  257.       flags := WindowFlagSet{windowDrag, windowClose, windowDepth};
  258.       firstGadget := NIL;
  259.       checkMark := NIL;
  260.       title := NIL;
  261.       screen := BACKScreen;
  262.       bitMap := NIL;
  263.       minWidth := 50; maxWidth := 320;
  264.       minHeight := 20; maxHeight := 256;
  265.       type := customScreen
  266.    END;
  267.    InitPlaene
  268. END StundenPlan.
  269.